/**
 * 
 */
package talayaco.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import talayaco.enums.DiagnosticoEnum;
import talayaco.enums.EstadoAnimalEnum;
import talayaco.enums.ProvinciaEnum;
import talayaco.enums.TipoAnimalEnum;
import talayaco.enums.TipoDietaEnum;
import talayaco.enums.TipoProveedorEnum;
import talayaco.vo.ClienteVO;
import talayaco.vo.CorralVO;
import talayaco.vo.DiagnosticoGeneralVO;
import talayaco.vo.ProveedorVO;
import talayaco.vo.ReporteAlimentoVO;
import talayaco.vo.ReporteAnimalVO;
import talayaco.vo.ReportePesajesVO;
import talayaco.vo.ReporteProporcionesVO;
import talayaco.vo.ReporteRecriaVO;

/**
 * @author Lucas
 * 
 */
public class MapToVo {

	/**
	 * Metodo que pasa un mapa con datos del proveedor a un VO de proveedor
	 * 
	 * @param proveedor
	 *            Mapa que contiene los datos de un proveedor
	 * @return
	 */
	public static ProveedorVO mapToProveedorVO(Map<String, String> proveedor) {
		ProveedorVO proveedorVO = new ProveedorVO();
		proveedorVO.setId(Long.parseLong(proveedor.get("id")));
		proveedorVO.setLocalidad(proveedor.get("localidad"));
		proveedorVO.setNombre(proveedor.get("nombre"));
		proveedorVO.setObservacion(proveedor.get("observacion"));
		proveedorVO.setProvincia(ProvinciaEnum.getDescProvincia(proveedor
				.get("provincia")));
		proveedorVO.setTipo(TipoProveedorEnum.valueOf(proveedor.get("tipo"))
				.getDescripcion());
		return proveedorVO;
	}

	/**
	 * Metodo que pasa un mapa con datos del cliente a un VO de cliente
	 * 
	 * @param cliente
	 *            Mapa que contiene los datos de un cliente
	 * @return
	 */
	public static ClienteVO mapToClienteVO(Map<String, String> cliente) {
		ClienteVO clienteVO = new ClienteVO();
		clienteVO.setId(Long.parseLong(cliente.get("id")));
		clienteVO.setLocalidad(cliente.get("localidad"));
		clienteVO.setNombre(cliente.get("nombre"));
		clienteVO.setObservacion(cliente.get("observacion"));
		clienteVO.setProvincia(ProvinciaEnum.getDescProvincia(cliente
				.get("provincia")));
		return clienteVO;
	}

	/**
	 * Metodo que trasforma un mapa con el nombre de alimento y el stock al vo
	 * de reporte de alimento cantidad
	 * 
	 * @param alimento
	 *            Mapa con nombre de alimento cantidad
	 * @return
	 */
	public static ReporteAlimentoVO mapToAlimentoVO(Map<String, String> alimento) {
		ReporteAlimentoVO reporteVO = new ReporteAlimentoVO();
		reporteVO.setNombre(alimento.get("nombre"));
		reporteVO.setStock(alimento.get("stock"));
		return reporteVO;
	}

	/**
	 * Metodo que obtiene el VO de reporte de animales
	 * 
	 * @param animal
	 *            Datos del animal
	 * @param clientes
	 *            Lista de mapas con datos del cliente
	 * @param proveedores
	 *            Lista de mapas con datos de proveedores
	 * @param corrales
	 *            Lista de mapas con datos de corrales
	 * @return ReporteAnimalVO
	 */
	public static ReporteAnimalVO mapToReporteAnimalVO(
			Map<String, String> animal, List<Map<String, String>> clientes,
			List<Map<String, String>> proveedores,
			List<Map<String, String>> corrales, Integer indice) {
		ReporteAnimalVO reporteAnimalVO = new ReporteAnimalVO();

		if (!StringUtils.isNullOrBlank(animal.get("cliente"))) {
			for (Map<String, String> cliente : clientes) {
				if (cliente.get("id").equals(animal.get("cliente"))) {
					reporteAnimalVO.setCliente(cliente.get("nombre"));
				}
			}
		} else {
			reporteAnimalVO.setCliente("---");
		}

		if (!StringUtils.isNullOrBlank(animal.get("corral"))) {
			for (Map<String, String> corral : corrales) {
				if (corral.get("id").equals(animal.get("corral"))) {
					reporteAnimalVO.setCorral(corral.get("nombre"));
					reporteAnimalVO.setTipoCorral(TipoDietaEnum.valueOf(
							corral.get("tipo")).getDescripcion());
				}
			}
		} else {
			reporteAnimalVO.setCorral("---");
			reporteAnimalVO.setTipoCorral("---");
		}

		if (!StringUtils.isNullOrBlank(animal.get("proveedor"))) {
			for (Map<String, String> proveedor : proveedores) {
				if (proveedor.get("id").equals(animal.get("proveedor"))) {
					reporteAnimalVO.setProveedor(proveedor.get("nombre"));
				}
			}
		} else {
			reporteAnimalVO.setProveedor("---");
		}

		if (!StringUtils.isNullOrBlank(animal.get("caravana"))) {
			reporteAnimalVO.setCaravana(animal.get("caravana"));
		} else {
			reporteAnimalVO.setCaravana("---");
		}

		if (!StringUtils.isNullOrBlank(animal.get("observaciones"))) {
			reporteAnimalVO.setObservacion(animal.get("observaciones"));
		} else {
			reporteAnimalVO.setObservacion("---");
		}

		String fechaIngreso = DateUtils.getFechaFormateada(animal
				.get("fechaIngreso"));
		String fechaEgreso = DateUtils.getFechaFormateada(animal
				.get("fechaEgreso"));
		reporteAnimalVO.setFechaEgreso(fechaEgreso);
		reporteAnimalVO.setFechaIngreso(fechaIngreso);

		reporteAnimalVO.setIndice(indice.toString());
		reporteAnimalVO.setTipo(TipoAnimalEnum.valueOf(animal.get("tipo"))
				.getDescripcion());

		if (animal.get("pesoIngreso").endsWith("0.00")) {
			reporteAnimalVO.setPesoIngreso("---");
		} else {
			reporteAnimalVO.setPesoIngreso(animal.get("pesoIngreso"));

		}

		reporteAnimalVO.setPesoTysaIngreso(animal.get("pesoTysaIngreso"));

		if (!StringUtils.isNullOrBlank(animal.get("pesoTysaEgreso"))) {
			reporteAnimalVO.setPesoTysaEgreso(animal.get("pesoTysaEgreso"));
		} else {
			reporteAnimalVO.setPesoTysaEgreso("---");
		}

		if (!animal.get("desbasteOrigen").equals("0.00")) {
			reporteAnimalVO.setDesbasteOrigen(animal.get("desbasteOrigen"));
		} else {
			reporteAnimalVO.setDesbasteOrigen("---");
		}

		reporteAnimalVO.setDesbasteTysa(animal.get("desbasteTysa"));
		reporteAnimalVO.setEstado(EstadoAnimalEnum.getDescripcion(animal
				.get("estado")));

		if (animal.get("hoteleria").equals("1")) {
			reporteAnimalVO.setHoteleria("SI");
		} else {
			reporteAnimalVO.setHoteleria("NO");
		}

		if (animal.get("dta").equals("1")) {
			reporteAnimalVO.setDta("SI");
		} else {
			reporteAnimalVO.setDta("NO");
		}

		if (animal.get("rodeoCria").equals("1")) {
			reporteAnimalVO.setRodeoCria("SI");
		} else {
			reporteAnimalVO.setRodeoCria("NO");
		}

		return reporteAnimalVO;
	}

	public static List<ReporteProporcionesVO> toReportePropocionesVO(
			List<Map<String, String>> dietaTeorica,
			List<Map<String, String>> dietaReal, BigDecimal cantidad,
			Map<String, String> params) {
		List<ReporteProporcionesVO> reportesProporcion = new ArrayList<ReporteProporcionesVO>();

		Map<String, String> mapAlimentoProporcion = new HashMap<String, String>();
		for (Map<String, String> dieta : dietaTeorica) {
			mapAlimentoProporcion.put(dieta.get("nombre"),
					dieta.get("cantidadTotal"));
		}
		BigDecimal cantidadTotal = new BigDecimal(0).setScale(2,
				BigDecimal.ROUND_HALF_UP);
		for (Map<String, String> movimiento : dietaReal) {
			ReporteProporcionesVO reporteProporcion = new ReporteProporcionesVO();
			reporteProporcion.setAlimento(movimiento.get("nombre"));
			Double cantidadDouble = new Double(movimiento.get("cantidadTotal"));
			cantidadTotal = cantidadTotal.add(new BigDecimal(movimiento
					.get("cantidadTotal")));
			reporteProporcion.setProporcionReal(String.valueOf(new BigDecimal(
					cantidadDouble / cantidad.doubleValue()).setScale(2,
					BigDecimal.ROUND_HALF_UP)));
			if (StringUtils.isNullOrBlank(mapAlimentoProporcion.get(movimiento
					.get("nombre")))) {
				reporteProporcion.setProporcionTeorica("");
			} else {
				reporteProporcion.setProporcionTeorica(mapAlimentoProporcion
						.get(movimiento.get("nombre")));
			}
			reportesProporcion.add(reporteProporcion);
		}
		params.put("cantidadComida", cantidadTotal.toString());

		for (Map<String, String> dieta : dietaTeorica) {
			boolean noExiste = true;
			for (ReporteProporcionesVO reporte : reportesProporcion) {
				if (reporte.getAlimento().equals(dieta.get("nombre"))) {
					noExiste = false;
					break;
				}
			}
			if (noExiste) {
				ReporteProporcionesVO reporteProporcion = new ReporteProporcionesVO();
				reporteProporcion.setAlimento(dieta.get("nombre"));
				reporteProporcion.setProporcionTeorica(dieta
						.get("cantidadTotal"));
				reporteProporcion.setProporcionReal("");
				reportesProporcion.add(reporteProporcion);
			}
		}

		return reportesProporcion;
	}

	public static CorralVO toCorralVO(Map<String, String> corral, Long cantidad) {
		CorralVO corralVO = new CorralVO();
		corralVO.setCantidad(cantidad.toString());
		corralVO.setNombre(corral.get("nombre"));
		corralVO.setTipo(TipoDietaEnum.valueOf(corral.get("tipo"))
				.getDescripcion());
		return corralVO;
	}

	public static ReportePesajesVO mapToReportePesaje(Map<String, String> pesaje) {
		ReportePesajesVO reportePesajeVO = new ReportePesajesVO();
		reportePesajeVO.setCantidad(pesaje.get("cantidad"));
		reportePesajeVO.setFecha(DateUtils.getFechaFormateada(pesaje
				.get("fecha")));
		return reportePesajeVO;
	}

	public static List<ReporteRecriaVO> mapToReporteRecria(
			List<Map<String, String>> recrias) {

		List<ReporteRecriaVO> reportesRecriaVO = new ArrayList<ReporteRecriaVO>();

		for (int i = 0; i < recrias.size(); i++) {

			Map<String, String> recriaMap = recrias.get(i);

			ReporteRecriaVO reportePesajeVO = new ReporteRecriaVO();
			reportePesajeVO.setCaravanaCria(recriaMap.get("caravanaCria"));
			reportePesajeVO.setCaravanaMadre(recriaMap.get("caravanaMadre"));
			reportePesajeVO.setEstado(EstadoAnimalEnum.getDescripcion(recriaMap
					.get("estado")));
			reportePesajeVO.setFechaDestete(DateUtils
					.getFechaFormateada(recriaMap.get("fechaDeteste")));
			reportePesajeVO.setFechaIATF(DateUtils.getFechaFormateada(recriaMap
					.get("fechaIATF")));
			reportePesajeVO.setFechaParto(DateUtils
					.getFechaFormateada(recriaMap.get("fechaParto")));
			reportePesajeVO.setFechaPParto(DateUtils
					.getFechaFormateada(recriaMap.get("fechaPParto")));
			reportePesajeVO.setFechaSNatural(DateUtils
					.getFechaFormateada(recriaMap.get("fechaSNatural")));
			reportePesajeVO.setIndice(i + 1);
			reportePesajeVO.setKgDestete(recriaMap.get("kgDeteste"));
			reportePesajeVO
					.setObservacionCria(recriaMap.get("observacionCria"));
			reportePesajeVO.setObservacionMadre(recriaMap
					.get("observacionMadre"));
			reportePesajeVO.setTipoToro(recriaMap.get("tipo"));

			reportesRecriaVO.add(reportePesajeVO);
		}

		return reportesRecriaVO;
	}

	/**
	 * Obtiene los diagnosticos para ser mostrados en el reporte.
	 * 
	 * @param diagnosticos
	 * @return
	 */
	public static List<DiagnosticoGeneralVO> mapToDiagnostico(
			List<Map<String, String>> diagnosticos) {

		List<DiagnosticoGeneralVO> diagnostico = new ArrayList<DiagnosticoGeneralVO>();

		for (int i = 0; i < diagnosticos.size(); i++) {

			Map<String, String> diagnosticoMap = diagnosticos.get(i);

			DiagnosticoGeneralVO diagnosticoGeneralVO = new DiagnosticoGeneralVO();
			diagnosticoGeneralVO.setNombre(DiagnosticoEnum
					.getDescripcion(diagnosticoMap.get("diagnostico")));
			diagnosticoGeneralVO.setObservacion(diagnosticoMap
					.get("observacion"));

			if (!StringUtils.isNullOrBlank(diagnosticoMap.get("observacion"))) {
				diagnosticoGeneralVO.setObservacion(diagnosticoMap
						.get("observacion"));
			} else {
				diagnosticoGeneralVO.setObservacion("---");
			}

			diagnosticoGeneralVO.setFecha(DateUtils
					.getFechaFormateada(diagnosticoMap.get("fecha")));
			
			if(!StringUtils.isNullOrBlank(diagnosticoMap.get("fechaHastaIATF"))){
				diagnosticoGeneralVO.setFechaHastaIATF(DateUtils
						.getFechaFormateada(diagnosticoMap.get("fechaHastaIATF")));
			} else {
				diagnosticoGeneralVO.setFechaHastaIATF("---");
			}
			
			diagnostico.add(diagnosticoGeneralVO);
		}

		return diagnostico;
	}
}
